#include <stdio.h>
#include "ohos_init.h"
#include "ohos_types.h"

#include <hi_types_base.h>
#include <hi_io.h>
#include <hi_early_debug.h>
#include <hi_gpio.h>
#include <hi_task.h>
#include "cmsis_os2.h"
#include "los_memory.h"

int g_off_time = 2;

void led_on(void)
{
    hi_gpio_set_ouput_val(HI_GPIO_IDX_9, HI_GPIO_VALUE0);
}

void led_off(void)
{
    hi_gpio_set_ouput_val(HI_GPIO_IDX_9, HI_GPIO_VALUE1);
}


void led_blink(void)
{
    hi_u32 ret;
    hi_gpio_value gpio_val = HI_GPIO_VALUE1;

    ret = hi_gpio_init();
    if (ret != HI_ERR_SUCCESS) {
        printf("===== ERROR ===== gpio -> hi_gpio_init ret:%d\r\n", ret);
        return;
    }
    printf("----- gpio init success-----\r\n");

    ret = hi_io_set_func(HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_GPIO);
    if (ret != HI_ERR_SUCCESS) {
        printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret);
        return;
    }
    printf("----- io set func success-----\r\n");

    ret = hi_gpio_set_dir(HI_GPIO_IDX_9, HI_GPIO_DIR_OUT);
    if (ret != HI_ERR_SUCCESS) {
        printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret);
        return;
    }

    /* 自动关灯程序 */
    led_off();
    while(1) {
        if (g_off_time == 0) {
            led_off();
        } else {
            g_off_time--;
        }
        sleep(1);
    }

    // unsigned int freeSize = LOS_MemPoolSizeGet(OS_SYS_MEM_ADDR);
    // int i = 0;
    // while(1) {
    //     hi_gpio_set_ouput_val(HI_GPIO_IDX_9, HI_GPIO_VALUE1);
    //     sleep(1);
    //     hi_gpio_set_ouput_val(HI_GPIO_IDX_9, HI_GPIO_VALUE0);
    //     sleep(2);

    //     if (i++ > 5) {
    //         i = 0;
    //         unsigned int UsedSize = LOS_MemTotalUsedGet(OS_SYS_MEM_ADDR);
    //         printf("MemTotal: %u / %u\n", UsedSize, freeSize);
    //     }
    // }
}

void i_led(void)
{
    osThreadAttr_t attr;
    attr.name = "led_blink";        //任务名称
    attr.attr_bits = 0U;            //任务的属性位
    attr.cb_mem = NULL;             //任务控制块的内存初始地址，默认为系统自动分配
    attr.cb_size = 0U;              //任务控制块的内存大小
    attr.stack_mem = NULL;          //任务的内存初始地址，默认为系统自动分配
    attr.stack_size = 8192;         //任务的内存大小
    attr.priority = 31;             //任务的优先级
    /** 创建任务 **/
    if (osThreadNew((osThreadFunc_t)led_blink, NULL, &attr) == NULL) {
        printf("[PWMTaskEntry] Falied to create led_blink!\n");
    }
}


SYS_RUN(i_led);
